package structuresManagers;

import java.io.IOException;

import register.Register;
import signatureFiles.SignatureFileObject;
import FilesManagers.CantOpenFileException;
import FilesManagers.FileManager;
import Filters.FullFilter;
import bplustree.BadChecksumException;

public class SignatureManager extends AbstractManager {
	private SignatureFileObject archivoFirmas;
	private String nombreArchivo;
	private Integer nbits;
	private Integer numberOfHash;
	
	public SignatureManager(String urls, String urlsProcesadas,
			FullFilter filtro) throws CantOpenFileException {
		super(urls, urlsProcesadas, filtro);
		// TODO Apéndice de constructor generado automáticamente
	}

	@Override
	protected void buildStructure(String archivo, Integer structureSize)
			throws IOException, CantOpenFileException {
		// TODO Apéndice de método generado automáticamente
		this.nombreArchivo=archivo;
		this.nbits=structureSize;
		archivoFirmas = new SignatureFileObject(archivo,structureSize,numberOfHash);

	}

	@Override
	protected void inMakeStructure(Register registro) throws IOException,
			BadChecksumException {
		archivoFirmas.addToHash(registro.getID().getID());
		// TODO Apéndice de método generado automáticamente

	}

	@Override
	protected Register inSearch(String objetivo) throws IOException,
			BadChecksumException {
		// TODO Apéndice de método generado automáticamente
		return archivoFirmas.search(objetivo);
	}

	@Override
	protected void inMakeStructureUrlFinished() throws IOException {
		// TODO Apéndice de método generado automáticamente
		archivoFirmas.writeHash();
		archivoFirmas = new SignatureFileObject(nombreArchivo,nbits,numberOfHash);
	}
	
	//Mantengo interfaz
	public String[] search(String archFirmas,String objetivo) throws CantOpenFileException{
		return this.searchSignature(archFirmas, objetivo);
	}
	public String[] searchSignature(String archFirmas,String objetivo) throws CantOpenFileException{
		this.numberOfHash=1;//dummy
		
		objetivo=filtro.procesarSearch(objetivo);
		String[] urlsCandidatas=super.search(archFirmas, objetivo);
		if(urlsCandidatas!= null){
			//Creo un archivo temporal para fuerza bruta
			FileManager.borrar("urlsCandidatas.txt");
			FileManager.borrar("urlsCandidatas1.txt");
			for(int i=0;i<urlsCandidatas.length;i++){
				FileManager.append("urlsCandidatas.txt",urlsCandidatas[i]+"\n");
			}
			System.out.println("Procesando las URLS candidatas por fuerza bruta");
			
			BruteForceManager bf = new BruteForceManager("urlsCandidatas.txt","urlsCandidatas1.txt",this.filtro/*new FullFilter()*/);
						
			String urls[] =bf.search(objetivo);
			
			FileManager.borrar("urlsCandidatas.txt");
			FileManager.borrar("urlsCandidatas1.txt");
			return urls;
		}else{
			return null;
		}
		
		//return super.search(archFirmas, objetivo);
		
		
	}
	public void makeNewSignature(String archFirma, Integer nbits, Integer numberOfHash) throws CantOpenFileException{
		this.numberOfHash=numberOfHash;
		makeNewStructure(archFirma, nbits);
		
	}
	public void makeSignature(String archFirma, Integer nbits ) throws CantOpenFileException{
		super.makeStructure(archFirma, nbits);
	}
	/*public void setNumberOfHash(int numberOfHash){
		
		archivoFirmas.setNumberOfHash(numberOfHash);
	}*/
	
	/*public String[] bruteForceSearch(String[] urlsCandidatas) throws CantOpenFileException{
		
		
		
		
		return String[] pepe;
	}*/
	

}
